"""
返回值就是一个函数返回的值-java和python里面return的值
    异同：python不需要指定返回值，写return用变量接收就能返回
        java泛型这个概念，返回值也是固定的类型，要么就是抛异常或者空值
"""
def user_fn1(*num):
    res=0
    for index in num:
        res+=index
    return res
# 解包操作
param=(1,2,3)
res=user_fn1(*param)
print("和是",res)

""""
python里面return 什么都可以跟，甚至跟一个函数
"""
def user_fn2():
    def fn():
        print('返回值是一个函数')
    return fn()

user_fn2()

"""
无返回值函数-java里面关键字void
    python只写一个return ->return None
    和java一样 return之后的逻辑都不会执行 ，循环出现return也不会继续 直接跳出当前方法
"""
def user_fn3():
    return
print("user_fn3返回值=",user_fn3())

"""
函数的作用域和命名空间
    和java一样，Python也有作用域这个概念，java里面有定义在类上的变量和定义在方法里的变量-全局变量。局部变量
        小的作用域能调用大的作用域的变量，大的无法调用小的作用域变量
    python的变量也有全局和局部变量的概念
"""

"""
全局变量-直接定义在方法外的就是全局变量
"""
a=10

"""
局部变量-在函数调用中创建的变量就是局部变量
    注意区别:java在方法中调用了全局变量并且重新赋值，那么再次调用时，就会变新值
    python和java不同，哪怕名字一样 函数定义的变量都是局部变量，获取的也是局部变量的值 
        要想获取全局变量，需要关键字global声明这个变量是全局变量 然后可以重新赋值全局变量就会是新的值
"""
def user_fn4():
    # a=5
    global a
    print("a的值",a)
    # 修改全局变量的值
    a=5
    print(a)
user_fn4()

"""
全局变量和局部变量混用的时候，这时候就需要考虑命名空间的问题
    这个有点类似于java.util.date和java.sql.date 两个都是时间类型但用途不一样，想用就要加上包名
python获取当前作用域的命名空间-locales()
    locales()方法返回的是一个字典->往字典里面set键值对就能添加全局变量，但不建议这么做
python可以在任意位置获取全局命名空间 -globals()方法
    globals()方法也是返回字典，当不传参的时候和locales()方法一样
    
"""
local = locals()
print(type(local))

def user_fn5():
    globals_scope = globals()
    print(type(globals_scope))
    print(globals_scope['a'])
    globals_scope['a']=30
    print(globals_scope['a'])
user_fn5()